package com.cy.pj.goods.dao;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Copyright (C), 2015-2020, XXX有限公司
 * FileName: DefaulftGoodsDao
 * Author:   ASUS
 * Date:     2020/9/28 15:55
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
/**
 * 此对象为一个商品层访问对象,现在要求在此类中定义一个方法,这个方法用于从数据库获取商品信息,
 *  并将其封装到map集合,要求一行记录一个map对象(key为表中字段名,值为字段名对应的值),多个map存储到list集合
 * @Repository此注解通常用于描述数据层实现类对象,本质上就是一个特殊的@Component,
 * 都是要交给spring管理的一个Bean对象
 */
@Repository
public class DefaulftGoodsDao {
    @Autowired
    private DataSource dataSource;
    //查询商品信息,一行记录一个map对象
    public List<Map<String,Object>> findGoods() throws SQLException {
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        String sql = "select * from tb_goods";
        //1,获取连接(从连接池获取)
        try {
            conn = dataSource.getConnection();
            //2,创建statement
            stat = conn.createStatement();
            //3,发送sql
            rs = stat.executeQuery(sql);
            //4,处理结果
            List<Map<String,Object>> list = new ArrayList<>();
            while (rs.next()){//循环一次取一行 一行记录映射为一个map对象
                Map<String,Object> rowMap = new HashMap<>();
                rowMap.put("id",rs.getInt("id"));
                rowMap.put("name",rs.getString("name"));
                rowMap.put("remark",rs.getString("remark"));
                rowMap.put("createdTime",rs.getTimestamp("createdTime"));
                list.add(rowMap);//将存储了一行记录的map对象再存储到list集合
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException(e);//转化为非检查异常(编译时不检查的异常)

        } finally {
            //5,释放资源
            if(rs!=null)try{rs.close();}catch (Exception e){e.printStackTrace();}
            if(stat!=null)try{stat.close();}catch (Exception e){e.printStackTrace();}
            //这里的连接是返回池中
            if(conn!=null)try{conn.close();}catch (Exception e){e.printStackTrace();}

        }

    }
}
